# 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
#
#  如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ，就返回 0。
# 假设环境不允许存储 64 位整数（有符号或无符号）。
#
#
#
#  示例 1：
#
#
# 输入：x = 123
# 输出：321
#
#
#  示例 2：
#
#
# 输入：x = -123
# 输出：-321
#
#
#  示例 3：
#
#
# 输入：x = 120
# 输出：21
#
#
#  示例 4：
#
#
# 输入：x = 0
# 输出：0
#
#
#
#
#  提示：
#
#
#  -231 <= x <= 231 - 1
#
#  Related Topics 数学
#  👍 2698 👎 0


# leetcode submit region begin(Prohibit modification and deletion)
# 解法一 32ms
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        # 求绝对值和赋予结果初始值
        y, res = abs(x), 0

        # 求出x分别在为正负数情况下的范围：（ 0-绝对值（最大值or最小值） ）
        boundry = 2 ** 31 - 1 if x > 0 else 2 ** 31

        # 如果还能弹出数字
        while y != 0:

            # 组装计算：上次弹出计算好的值乘以10 加上 这一次弹出的数字
            res = res * 10 + y % 10

            # 若反转组装的过程中已经溢出，已经不用继续计算下去了，直接返回0
            if res > boundry:
                return 0

            # 弹出这次的数字
            y //= 10

        return res if x > 0 else -res


# 解法二 转为字符串再做处理
# class Solution(object):
#     def reverse(self, x):
#         """
#         :type x: int
#         :rtype: int
#         """
#
#         # 整形转为字符串
#         str_x = str(x)
#
#         # 字符串反转
#         middle_list = []
#         for _str in str_x:
#             middle_list.append(_str)
#         reverse_str_x = ''
#         for __str in middle_list[::-1]:
#             reverse_str_x += __str
#
#         # 将反转后前面的0去掉（若存在）
#         while reverse_str_x[0] == '0' and len(reverse_str_x) != 1:
#             reverse_str_x = reverse_str_x[1:]
#             continue
#
#         # 将负号放回前面（若存在）
#         if reverse_str_x[-1] == '-':
#             reverse_str_x = '-' + reverse_str_x[0:-1]
#         reverse_int_x = int(reverse_str_x)
#
#         # 返回
#         if not -2 ** 31 <= reverse_int_x <= 2 ** 31 - 1:
#             return 0
#         else:
#             return reverse_int_x

